package com.study.get.jsl.ths;

import org.junit.jupiter.api.Test;

import java.util.Base64;
import java.util.Random;

/**
 * @author zhuzi
 * 2025/2/7 上午8:43
 */
public class KeyDemo {
    // 模拟 JavaScript 的 Date.now() 方法
    private static long getCurrentTime() {
        return System.currentTimeMillis() / 1000; // 返回秒级时间戳
    }

    // 模拟 JavaScript 的 Math.random() 方法
    private static double getRandom() {
        return new Random().nextDouble();
    }

    // 模拟 JavaScript 的 encodeURIComponent 方法
    private static String encodeURIComponent(String str) {
        try {
            return java.net.URLEncoder.encode(str, "UTF-8")
                    .replaceAll("\\+", "%20")
                    .replaceAll("%21", "!")
                    .replaceAll("%27", "'")
                    .replaceAll("%28", "(")
                    .replaceAll("%29", ")")
                    .replaceAll("%7E", "~");
        } catch (Exception e) {
            throw new RuntimeException("Failed to encode URI component", e);
        }
    }

    // 模拟 JavaScript 的 Base64 编码
    private static String base64Encode(String str) {
        return Base64.getEncoder().encodeToString(str.getBytes());
    }

    // 模拟 JavaScript 的字符串哈希函数
    private static int stringHash(String str) {
        int hash = 0;
        for (int i = 0; i < str.length(); i++) {
            hash = (hash << 5) - hash + str.charAt(i);
            hash |= 0; // 转换为 32 位整数
        }
        return hash;
    }

    // 核心的 v 函数
    public static String v() {
        // 模拟 JavaScript 中的全局变量
        long tokenServerTime = 1572845499L; // 示例时间戳
        String token = "example_token"; // 示例 token

        // 生成随机数
        double randomValue = getRandom();

        // 获取当前时间
        long currentTime = getCurrentTime();

        // 构造待加密的字符串
        String dataToEncrypt = token + "|" + currentTime + "|" + randomValue;

        // 对字符串进行哈希
        int hashValue = stringHash(dataToEncrypt);

        // 对哈希值进行 Base64 编码
        String encodedHash = base64Encode(String.valueOf(hashValue));

        // 返回最终结果
        return encodedHash;
    }

    @Test
    public void vs() {
        String v = v();
        System.out.println(v);
    }

}
